<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 复值 

        // 赋值  
        // let obj = {name:'张三',age:18};
        // let obj2 = obj;
        // // console.log(obj2); // {name:'张三',age:18}
        // // console.log(obj2); // {name:'张三',age:18}
        
        // obj2.name = '李四';
        // console.log(obj); // {name:'李四',age:18}

        // 浅拷贝
        // 赋值 是一模一样的数据结构 不是方法  
        // 浅拷贝  深拷贝  数组和对象  

        // 浅拷贝  只拷贝一层  

        // const ob3 = {
        //     name:'张三',
        //     age:18,
        //     child:{
        //         name:'李四',
        //         age:3
        //     }
        // }

        // const ob4 = {};
        // for(let k in ob3){
        //     ob4[k] = ob3[k];
        // }
        // console.log(ob3);
        // console.log(ob4);

        // ob4.name = '王666'; //第一层
        // ob4.child.name = '王五8888';// 第二层

        // console.log(ob3); 
        // console.log(ob4);

        // Object.assign(新对象,原对象);
        // const ob5= {
        //     name:'张三',
        //     age:18,
        //     child:{
        //         name:'李四',
        //         age:3
        //     }
        // }

        // const ob6 = Object.assign({},ob5);
        // console.log(ob6);
        // 深拷贝 
        
        function deepCopy1(target,origin){
            // 新对象 原对象
            // 如果你的值是对象 或者数组  继续递归 
            // 如果不是对象或者数组  直接存储  
            // 如果遍历的过程中 键对应的结果是对象 或者数组 
            // 那么就要继续递归 

            // 如果不是 
            // 往target 中存放结果  target 默认是个空对象
            for(let k in origin){
                if(origin[k].constructor === Object){
                    target[k] = {}; // 如果是对象 就创建一个空对象
                    arguments.callee(target[k],origin[k]);


                }else if(origin[k].constructor === Array){
                    target[k] = []; // 如果是数组 就创建一个空数组
                    arguments.callee(target[k],origin[k]);
                }

                else{
                    target[k] = origin[k];
                }
            }

            return target;
        }

        const ob7 = {
            name:'张三',
            age:18,
            child:{
                name:'李四',
                age:3
            }
        }

        const newobj = deepCopy({},ob7);
        console.log(newobj);


        newobj.name = '王666'; //第一层
        newobj.child.name = '王五8888';// 第二层

        console.log(ob7);
        console.log(newobj);

      


    </script>
</body>
</html>